/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../macro/head.h"
#include "../msg/head.h"
#include "include.h"
#include "hook.h"
#include "mgr.h"

namespace xos_box
{

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_container::i_container* container_ptr = 0;
    static mgr * mgr_ptr = 0;

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr()
    {
        init_data();
    }

    mgr::~mgr()
    {}

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::static_init( xos_container::i_container* pContainer, i_box_mgr** ppv )
    {
        return xos_stl::static_init_module( pContainer, ppv, container_ptr, mgr_ptr );
    }

    xos_container::i_container* mgr::container()
    {
        return container_ptr;
    }

    mgr * mgr::get()
    {
        return mgr_ptr;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    // 
    // need release
    // 

    i_all_done_test * mgr::all_done_test()
    {
        all_done_test::T * pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_big_buf* mgr::big_buf()
    {
        big_buf_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_buf* mgr::buf()
    {
        buf_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_msg* mgr::msg()
    {
        msg_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_wstring* mgr::wstring()
    {
        wstring_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_string* mgr::string()
    {
        string_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_lock_free_queue* mgr::queue()
    {
        lock_free_queue_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_list* mgr::list()
    {
        list_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_int_property* mgr::get_int_prop()
    {
        int_property_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_str_property* mgr::get_str_prop()
    {
        str_property_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_variant* mgr::vt()
    {
        variant_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_lock_obj* mgr::lobj()
    {
        lock_obj::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_lock_num* mgr::lnum()
    {
        lock_num::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_callback* mgr::callback()
    {
        callback_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_threads* mgr::threads()
    {
        threads_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // need not release
    // 
    i_engine* mgr::engine()
    {
        return m_pEngine;
    }

    i_serial* mgr::serial()
    {
        return m_pSerial;
    }

    i_heart* mgr::heart()
    {
        return m_pHeart;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::put_back_to_pool()
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init_data()
    {
        int ret = 0;
        m_pEngine = 0;
        m_pSerial = 0;
        m_pHeart = 0;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            ret = hook::init();
        }

        if( 0 == ret )
        {
            engine_impl::T* pT = 0;
            xos_stl::init_pool_item( pT );
            m_pEngine = pT;
        }

        if( 0 == ret )
        {
            serial_impl::T* pT = 0;
            xos_stl::init_pool_item( pT );
            m_pSerial = pT;
        }

        if( 0 == ret )
        {
            heart_impl::T* pT = 0;
            xos_stl::init_pool_item( pT );
            m_pHeart = pT;
        }

        return ret;
    }

    int mgr::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pHeart );
        xos_stl::release_interface( m_pSerial );
        xos_stl::release_interface( m_pEngine );
        hook::term();
        return ret;
    }

} // xos_box
